package CutLoad.mc
{
	import CutLoad.Base;
	import CutLoad.CTipManagement;
	
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.geom.Rectangle;

	/**
	 * 组装目标,该类会根据特定名称的小方块做为位置和大小来向里边添加一些元件 ,这些特定的小方块的默认名称为mc,如：mc1,mc2,mc3,mc4..
	 * @author smallerbird mail:smallerbird@gmail.com  site:www.mkigm.com QQ群:49983196
	 * 
	 */	
	public class FactoryTarget
	{
		private var arrR:Array;
		private var arrMc:Array;
		private var target:Sprite;
		/**
		 * 
		 * @param layoutMcCount  特定名称的小方块数量
		 * @param layoutMcNameFirst 特定名称的小方块相同的名称前缀:如mc1,mc2,mc3  相同的名称为mc
		 * 
		 */		
		public function FactoryTarget(target:MovieClip,layoutMcCount:Number,layoutMcNameFirst:String="mc",arrRSet:Array=null)
		{
			if(arrRSet!=null){
				if(arrRSet.length!=layoutMcCount) throw new Error("所有提供的arrR的长度不等于:"+layoutMcCount);
			}
			this.target=target;
			var mc:MovieClip=target;
			if(mc[layoutMcNameFirst+layoutMcCount]==null) throw new Error("没有找到"+(layoutMcNameFirst+layoutMcCount)+"这个对象，用于参考的小方块是从1开始到"+layoutMcCount+"结束的");
			var isArrRNull:Boolean;
			if(arrRSet==null){
				isArrRNull=true;
				arrR=new Array();
			}else{
				isArrRNull=false;
				arrR=arrRSet;
			}
			arrMc=new Array();
			for(var i:Number=1;i<=layoutMcCount;i++){
				var mcTem:MovieClip=mc[layoutMcNameFirst+i] as MovieClip;
				if(isArrRNull){
					arrR.push(mcTem.getRect(mc));
				}else{
					var rTem:Object=arrR[i-1];
					if(rTem.x==null||rTem.y==null||rTem.width==null||rTem.height==null) throw new Error("arrR里的各项缺少下面某个属性x,y,width,height");
					mcTem.x=rTem.x;
					mcTem.y=rTem.y;
					mcTem.width=rTem.width;
					mcTem.height=rTem.height;
				}
				arrMc.push(mcTem);
				mcTem.visible=false;
			}
		}
		/**
		 * 添加一个元素 
		 * @param base 要添加的元素
		 * @param index 放置在第几个位置   注：下标是从0开始的
		 * @param isSetWH 是否要与该位置宽度一样
		 * 
		 */		
		public function append(base:Base,index:Number,isSetWH:Boolean=false):void{
			checkIndex(index)
			var rTem:Rectangle=arrR[index]
			base.setXY(rTem.x,rTem.y,target);
			if(isSetWH) base.setWH(rTem.width,rTem.height);
		}
		/**
		 * 删除一个元素 
		 * @param base
		 * @return 
		 * 
		 */		
		public function removeChild(base:Base):void{
			if(base.parent==null) throw new Error("它的base.parent为空!");
			if(base.parent!=target) throw new Error("它的不在这里");
			target.removeChild(base);
		}
		/**
		 * 一次全部加进去 
		 * @param arr 所有元素组成的数组
		 * @param arrSetWH 是否要与该位置宽度一样,与该方法第一个参数相对应.注：该参数其实指定的值就是Factory.append(base:Base,index:Number,isSetWH:Boolean=false)  的最后一个参数.
		 * 
		 */		
		public function appendAll(arr:Array,arrSetWH:Array):void{
			if(arr.length!=arrSetWH.length) throw new Error("两个参数数组长度不相等:appendAll(arr:Array,arrSetWH:Array)");
			if(arr.length!=arrMc.length) throw new Error("添加的总元素个数应为:"+arrMc.length);
			for(var i:Number=0;i<arrMc.length;i++){
				append(arr[i],i,arrSetWH[i])
			}
		}
		/**
		 * 获得某一个方块 
		 * @param index
		 * @return 
		 * 
		 */		
		public function getOne(index:Number):MovieClip{
			checkIndex(index)
			return arrMc[index]
		}
		/**
		 * 返回 某个布局小方块Rectangle信息
		 * @param index 第几个位置
		 * @return 
		 * 
		 */		
		public function getLayoutRect(index:Number):Rectangle{
			checkIndex(index)
			return arrR[index];
		}
		//检测索引是否越界
		private function checkIndex(index:Number):void{
			if(index<0||index>=arrR.length) throw new Error("索引不此范围0~"+(arrR.length-1)+" 注:索引是从0开始的");
		}
	}
}